package org.Yiran.timetale_re.item.tool.hammer.base;

import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Tier;
import net.minecraft.world.item.TieredItem;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import org.Yiran.timetale_re.util.item.TooltipUtils;
import org.jetbrains.annotations.NotNull;

import javax.annotation.Nullable;
import java.util.List;

/**
 * 锤子工具基类
 * <p>
 * 该类是所有锤子工具的抽象基类，定义了锤子的基本行为和属性。
 * 锤子主要用于破坏方块，具有比普通工具更大的破坏范围。
 * </p>
 */
public abstract class HammerItem extends TieredItem {
    
    // ==============================
    // 属性定义
    // ==============================
    /** 攻击伤害 */
    private final float attackDamage;
    /** 攻击速度 */
    private final float attackSpeed;

    // ==============================
    // 构造方法
    // ==============================

    /**
     * 锤子构造函数
     * <p>
     * 创建一个锤子实例，设置工具材料、攻击伤害、攻击速度和物品属性。
     * </p>
     *
     * @param tier          工具材料
     * @param attackDamage  攻击伤害加成
     * @param attackSpeed   攻击速度
     * @param properties    物品属性
     */
    public HammerItem(Tier tier, float attackDamage, float attackSpeed, Item.Properties properties) {
        super(tier, properties);
        this.attackDamage = attackDamage + tier.getAttackDamageBonus();
        this.attackSpeed = attackSpeed;
    }

    // ==============================
    // 物品属性方法
    // ==============================

    /**
     * 获取物品的挖掘速度
     * <p>
     * 重写父类方法，返回锤子对适用方块的挖掘速度。
     * </p>
     *
     * @param stack 锤子物品栈
     * @param state 被挖掘方块的状态
     * @return 挖掘速度值
     */
    @Override
    public float getDestroySpeed(@NotNull ItemStack stack, @NotNull BlockState state) {
        return isCorrectToolForDrops(state) ? getTier().getSpeed() : 1.0F;
    }

    /**
     * 判断是否适用于挖掘指定方块
     * <p>
     * 重写父类方法，判断锤子是否适用于挖掘指定方块。
     * </p>
     *
     * @param state 方块状态
     * @return 如果适用于挖掘返回true，否则返回false
     */
    @Override
    @SuppressWarnings("deprecation")
    public boolean isCorrectToolForDrops(BlockState state) {
        // 锤子适用于需要镐挖掘的方块
        return getTier().getLevel() >= state.getDestroySpeed(null, BlockPos.ZERO);
    }

    /**
     * 当方块被挖掘时调用
     * <p>
     * 重写父类方法，在挖掘方块时减少物品耐久度。
     * </p>
     *
     * @param stack  锤子物品栈
     * @param state  被挖掘方块的状态
     * @param pos    被挖掘方块的位置
     * @param entity 挖掘方块的实体
     * @return 操作是否成功
     */
    @Override
    public boolean mineBlock(@NotNull ItemStack stack, @NotNull Level level, @NotNull BlockState state, @NotNull BlockPos pos, @NotNull LivingEntity entity) {
        if (!level.isClientSide && state.getDestroySpeed(level, pos) != 0.0F) {
            stack.hurtAndBreak(1, entity, (e) -> e.broadcastBreakEvent(entity.getUsedItemHand()));
        }
        return true;
    }

    /**
     * 添加物品悬停文本提示
     * <p>
     * 重写父类方法，在物品悬停时显示相关信息。
     * 调用TooltipUtils工具类添加通用的提示信息。
     * </p>
     *
     * @param stack   物品栈
     * @param level   世界对象
     * @param tooltip 提示文本列表
     * @param flag    提示标志
     */
    @Override
    @OnlyIn(Dist.CLIENT)
    public void appendHoverText(@NotNull ItemStack stack, @Nullable Level level, @NotNull List<Component> tooltip, @NotNull TooltipFlag flag) {
        super.appendHoverText(stack, level, tooltip, flag);
        // 添加基础描述
        TooltipUtils.addBaseDescription(tooltip, this.getDescriptionId());

        // 隔一行
        TooltipUtils.addSeparatorLine(tooltip);

        // 检查是否按下了Shift键并显示相应信息
        if (TooltipUtils.isShiftPressed()) {
            // 显示详细信息
            TooltipUtils.addDetailedInfo(tooltip, this.getDescriptionId());
        } else {
            // 提示按Shift查看详细信息
            TooltipUtils.addShiftPrompt(tooltip);
        }
    }

    /**
     * 获取攻击伤害
     * <p>
     * 返回该锤子的攻击伤害值。
     * </p>
     *
     * @return 攻击伤害值
     */
    public float getAttackDamage() {
        return this.attackDamage;
    }

    public float getAttackSpeed() {
        return attackSpeed;
    }
    
    /**
     * 获取锤子等级
     * <p>
     * 返回该锤子的等级，用于判断是否可以进行特定的锻造操作。
     * </p>
     *
     * @return 锤子等级
     */
    public int getHammerLevel() {
        return this.getTier().getLevel();
    }
    
    /**
     * 使用物品右键点击方块时调用
     * <p>
     * 处理锤子与方块的交互逻辑
     * </p>
     *
     * @param context 使用上下文
     * @return 交互结果
     */
    @Override
    public InteractionResult useOn(UseOnContext context) {
        // 默认返回PASS，让事件处理系统处理其他逻辑
        return InteractionResult.PASS;
    }
}